import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import jieba
import re
from datetime import datetime
import numpy as np


# 设置中文字体（避免中文乱码）
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
#把表格给我掏出来！！！
df = pd.read_csv('python_commments.csv')#使用pandas这个库打开数据集
#其实没啥用，但是人家做分析都做，我就加上了，这一步的前提是你不知道你处理的是个什么表格，那你就要用print看你的表格大致内容，其实也可以看一下python分析的到底是不是你的表格。
print("原始数据形状:", df.shape)#将数据的行数和列数表示出来df.shape会形成一个元组
print(df.head())#df.head将数据的前五行表示出来
#=====================
#数据处理
#=====================

#第一步：将时间戳格式改为我想要的格式，从时间戳转化为detetime格式

df['评论时间'] = pd.to_datetime(df['评论时间'], unit='ms')
# 提取日期
df['日期'] = df['评论时间'].dt.date
df['月份'] = df['评论时间'].dt.month
print("\n转换后的时间示例:")
print(df[['评论时间', '日期','月份']].head())#依旧是起一个检验的作用，以免打印失败
#以上的过程中，将所有的评论时间从时间戳格式转化为detetime格式，并从中抽出来评论日期和评论时间供之后的分析用。

#第二步：清理一下我不需要的评论，大学mooc的评论数据集还是比较完善的，不会出现那种空集或者奇怪的评分，所以这部分的数据预处理只需要清理一下完全一致的评论以及没有任何意义的评论即可。空集和无关的评论，以后再学吧。

#明确我们删除的标准：1，要将所有的只含符号的评论删除。这个过程需要一个判断：需要判断这个评论里面到底是不是空的，或者全是符号的。
def is_meaningful(text):
    if pd.isna(text):#检查一下这个评论是不是完全空的，对于mooc其实没这个必要，但是4000多条我一条一条看太累了，就算了。
        return False
    text = str(text).strip()#去除一下评论神人会不会加个空格
    if not text:
        return False  # 空字符串或全空格
    # 检查是否包含：中文 \u4e00-\u9fa5 | 英文字母 a-zA-Z | 数字 0-9，这里要专门解释一下这里使用了一个正则，及规则，\u4e00-\u9fa5表示的是从unicode的编码范围从一到龥，之后就是英语的从a_z.从A-Z，数字从0-9.\u4e00-\u9fa5这里加上\的目的是机器还是会比较呆的。别认错了。
    if re.search(r'[\u4e00-\u9fa5a-zA-Z0-9]', text):
        return True
    else:
        return False
# 应用过滤
df = df[df['评论'].apply(is_meaningful)].copy()#对数据那一行提取进行提取，后对每一个数据进行一次函数，将其作为一个筛选条件，将false去除，copy是为了防止在之前的数据集上做，破坏原来的，还是建造个新的好了。

# 第三步：按「用户名 + 评论」去重，保留第一条

df = df.drop_duplicates(subset=['用户名称', '评论'], keep='first').reset_index(drop=True)#这个一步一步思考即可，最后一个的目的是重新生成索引。
print(f"去重后最终数据量: {len(df)}")

# 第四步：将清理完的数据进行保存

df.to_csv('cleaned_comments.csv', index=False, encoding='utf-8-sig')
print("✅ 清理完成！结果已保存为 cleaned_comments.csv")

